package logica.persistencia;


import java.util.List;

import logica.Atributo;
import logica.Entidad;

import org.jdom.Element;

import borrador.grafica.TransformadorAGraficable;

import vista.objetos.AtributoGraficable;
import vista.objetos.AtributoTipoNoSoportadoException;
import vista.objetos.EntidadGraficable;
import vista.objetos.GraficableConEtiqueta;
import vista.objetos.NoEsObjetoDiagramableException;
import xml.ConstantesXml;
import xml.XMLManager;



public class EntidadGraficablePersistente extends
		GraficableConEtiquetaPersistente {
	

	public EntidadGraficablePersistente(
			GraficableConEtiqueta _graficableConEtiqueta) {
		super(_graficableConEtiqueta);

	}

	
	private AtributoGraficable obtenerAtributoGraficable(List<AtributoGraficable> lista, Atributo atrib) {
		for (AtributoGraficable atributoG : lista) {
			if (atributoG.getAtributo() == atrib) {
				return atributoG;
			}
		}
		return null;
	}
	private void hidratarAtributos() {
		Element elementListaAtributos = this.getElementoGraficable().getChild(ConstantesXml.LISTA_ATRIBUTOS);
		
		if (elementListaAtributos != null) {
			@SuppressWarnings("unchecked")
			List <Element> elementListaAtributosSimples = elementListaAtributos.getChildren(ConstantesXml.ELEMENTO_ATRIBUTO_SIMPLE);
			Entidad entidad;
			try {
				entidad = (Entidad)this.getGraficableConEtiqueta().getObjetoDiagramaDecorado();
				List<AtributoGraficable> atributos = TransformadorAGraficable.getAtributoGraficables(entidad.getAtributos());
				for (Element elementoAtributo: elementListaAtributosSimples) {
					String clave = elementoAtributo.getAttributeValue(ConstantesXml.ATRIBUTO_ID_OBJETO);
					Atributo atrib = (Atributo)XMLManager.getInstance().objtenerObjetoDiagramaConClave(clave);
					
					AtributoGraficable atribG = this.obtenerAtributoGraficable(atributos, atrib);
					if (atribG != null){ 
						AtributoGraficablePersistente atribGP = new AtributoGraficablePersistente(atribG);
						atribGP.setElementoGraficable(elementoAtributo);
						atribGP.hidratar();
						EntidadGraficable entG = (EntidadGraficable) this.getGraficableConEtiqueta();
						entG.getAtributos().add(atribG);
					}
				}
				
			} catch (NoEsObjetoDiagramableException e) {
				e.printStackTrace();
			} catch (AtributoTipoNoSoportadoException e) {
				e.printStackTrace();
			}
			 
		}	
	}
	
	
	@Override
	public void serializar() {
		
		
		Element elementoEntidad = new Element (ConstantesXml.ELEMENTO_ENTIDAD);
		this.setElementoGraficable(elementoEntidad);
		Entidad entidad;
		try {
			entidad = (Entidad)this.getGraficableConEtiqueta().getObjetoDiagramaDecorado();
			super.serializarGenerico(entidad, elementoEntidad);
			
		} catch (NoEsObjetoDiagramableException e) {
			
			e.printStackTrace();
		}
		
		this.getElementoPadre().addContent(elementoEntidad);
		EntidadGraficable entG = (EntidadGraficable) this.getGraficableConEtiqueta();
		AtributoGraficablePersistente.serializarAtributos(entG.getAtributos(), elementoEntidad);
		
//		super.serializarElementoGenerico(elementoEntidad);
//		elementoEntidad.setAttribute(ConstantesXml.ATRIBUTO_NOMBRE, entidad.getNombre());
//		elementoEntidad.setAttribute(ConstantesXml.ATRIBUTO_TIPO, entidad.getTipo().toString());
		
	}

	public static Element serializarElementoEntidadGraficable(Entidad entidad) {
		EntidadPersistente entidadHijaP = entidad.getObjetoDiagramaPersistente();
		Element ref = new Element (ConstantesXml.ELEMENTO_REF_ENTIDAD);
		int idRefEntidad = entidadHijaP.getIdentificador();
		ref.setAttribute(ConstantesXml.ATRIBUTO_NOMBRE_REF, entidad.getNombre());
		ref.setAttribute(ConstantesXml.ATRIBUTO_ID_REF,  String.valueOf(idRefEntidad));
		return ref;
	}
	@Override
	public void hidratar() {
		super.hidratarGenerico(this.getElementoGraficable());
		EntidadGraficable entG = (EntidadGraficable) this.getGraficableConEtiqueta();
		Entidad entidad;
		try {
			entidad = (Entidad)this.getGraficableConEtiqueta().getObjetoDiagramaDecorado();
			
			List<AtributoGraficable> atributos = TransformadorAGraficable.getAtributoGraficables(entidad.getAtributos());
			AtributoGraficablePersistente.hidratarAtributos(atributos,entG, this.getElementoGraficable());
		} catch (NoEsObjetoDiagramableException e) {
			e.printStackTrace();
		} catch (AtributoTipoNoSoportadoException e) {
			e.printStackTrace();
		}
		
	}

	

	

}
